Comment compiler Nginx à partir des sources sur Debian 10

Introduction

Nginx est un logiciel de serveur web à code source ouvert, conçu dans un souci de haute concurrence, qui peut être utilisé comme serveur HTTP/HTTPS, serveur proxy inverse, serveur proxy de messagerie, équilibreur de charge logiciel, terminateur TLS, serveur de mise en cache et plus encore !

Il s'agit d'un logiciel très modulaire. Même certaines parties apparemment "intégrées" du logiciel, comme GZIP ou SSL, sont en fait créées en tant que modules qui peuvent être activés et désactivés au moment de la construction.

Il existe des modules de base (natifs) et des modules tiers (externes) créés par la communauté. Actuellement, il existe plus d'une centaine de modules tiers que nous pouvons utiliser.

Écrit en C, c'est un logiciel rapide et léger.

L'installation de Nginx à partir du code source est relativement simple : téléchargez la dernière version du code source de Nginx, configurez-la, construisez-la et installez-la.

Vous devrez choisir de télécharger la version principale ou une version stable, mais leur construction est la même.

Dans ce guide, nous allons compiler une version mainline de Nginx sur Debian 10 (buster). Nous utiliserons tous les modules disponibles dans la version open-source de Nginx.

Pourquoi compiler et installer Nginx à partir des sources ?

Vous vous demandez probablement pourquoi compiler Nginx à partir d'une source alors que vous pouvez utiliser des paquets préparés. Voici quelques raisons qui peuvent vous inciter à compiler vous-même un logiciel spécifique :

    - Pour contrôler les options de configuration.

    - Pour installer le logiciel où vous voulez. Vous pouvez même installer plusieurs versions différentes du même logiciel.

    - Pour contrôler la version que vous installez. Les distributions ne sont pas toujours à jour avec les dernières versions de tous les paquets, en particulier les modules complémentaires aux paquets logiciels.

    - Pour mieux comprendre le fonctionnement du logiciel.

Version stable et version principale

Nginx Open Source est disponible en deux versions :

    - Mainline - Comprend les dernières fonctionnalités et corrections de bogues et est toujours à jour. Elle est fiable, mais elle peut inclure certains modules expérimentaux et peut également comporter un certain nombre de nouveaux bogues.

    - Stable - N'inclut pas toutes les dernières fonctionnalités, mais comporte des corrections de bogues critiques qui sont toujours reportées dans la version principale.

Modules de base et modules tiers

Nginx possède deux types de modules que vous pouvez utiliser : les modules de base et les modules tiers.

Les développeurs du noyau de Nginx créent les modules de base, qui font partie du logiciel lui-même.

La communauté construit des modules tiers et vous pouvez les utiliser pour étendre les fonctionnalités. Il existe un grand nombre de modules tiers utiles.

Modules statiques et modules dynamiques

Les modules statiques existent dans Nginx depuis la toute première version. Les modules dynamiques ont été introduits avec Nginx 1.9.11+ en février 2016.

Avec les modules statiques, un ensemble de modules qui constituent un binaire Nginx est fixé au moment de la compilation par le script ./configure

Les modules statiques utilisent la syntaxe --with-foo_bar_module ou –add-module=PATH

Pour compiler un module de base (standard) comme dynamique, nous ajoutons =dynamic, par exemple  --with-http_image_filter_module=dynamic.

Pour compiler un module tiers en dynamique, nous utilisons la syntaxe --add-dynamic-module=/path/to/module , puis nous les chargeons en utilisant la directive  load_module dans le contexte global du fichier nginx.conf

Conditions requises pour construire Nginx à partir des sources

En comparaison avec d'autres logiciels UNIX/Linux, Nginx est assez léger et ne dépend pas de beaucoup de bibliothèques. La configuration de construction par défaut ne dépend que de 3 bibliothèques à installer : OpenSSL/LibreSSL/BoringSSL, Zlib et PCRE.

NOTE: Nginx peut également être compilé avec les bibliothèques cryptographiques LibreSSL et BoringSSL au lieu d'OpenSSL.

Avant de commencer

Vérifiez la version de Debian.

lsb_release -ds

# Debian GNU/Linux 10 (buster)

Créez un utilisateur  avec un accès sudo.

adduser johndoe --gecos "John Doe"

usermod -aG sudo johndoe

NOTE : Remplacez johndoe par votre nom d'utilisateur.

Passez au nouvel utilisateur.

su - johndoe

Configurez le fuseau horaire.

sudo dpkg-reconfigure tzdata

Mettez à jour les logiciels de votre système d'exploitation.

sudo apt update && sudo apt upgrade -y

Installez les paquets nécessaires.

sudo apt install -y software-properties-common ufw

Construire Nginx à partir des sources

Nginx est un programme écrit en C, vous devrez donc d'abord installer un outil de compilation. Installez build-essential, git et tree.

sudo apt install -y build-essential git tree

Téléchargez la dernière version principale (mainline) du code source de Nginx et décompressez l'archive du code source. Le code source de Nginx est distribué sous forme d'archive compressée, comme la plupart des logiciels Unix et Linux.

wget https://nginx.org/download/nginx-1.17.2.tar.gz && tar zxvf nginx-1.17.2.tar.gz

Téléchargez le code source des dépendances obligatoires de Nginx et les extraire

# PCRE version 8.43

wget https://ftp.pcre.org/pub/pcre/pcre-8.43.tar.gz && tar xzvf pcre-8.43.tar.gz

 

# zlib version 1.2.11

wget https://www.zlib.net/zlib-1.2.11.tar.gz && tar xzvf zlib-1.2.11.tar.gz

 

# OpenSSL version 1.1.1c

wget https://www.openssl.org/source/openssl-1.1.1c.tar.gz && tar xzvf openssl-1.1.1c.tar.gz

Installez les dépendances optionnelles de Nginx.

sudo apt install -y perl libperl-dev libgd3 libgd-dev libgeoip1 libgeoip-dev geoip-bin libxml2 libxml2-dev libxslt1.1 libxslt1-dev

Nettoyez tous les fichiers .tar.gz. Nous n'en avons plus besoin.

rm -rf *.tar.gz

Entrez le répertoire source de Nginx.

cd ~/nginx-1.17.2

Pour faire bonne mesure, listez les répertoires et les fichiers qui composent le code source de Nginx avec tree.

tree -L 2 .

Copiez la page de manuel dans /usr/share/man/man8/.

sudo cp ~/nginx-1.17.2/man/nginx.8 /usr/share/man/man8

sudo gzip /usr/share/man/man8/nginx.8

ls /usr/share/man/man8/ | grep nginx.8.gz

# Check that man page for Nginx is working

man nginx

Pour vous aider, vous pouvez voir une liste complète des options de compilation de Nginx en exécutant la commande suivante.

./configure --help

# To see want core modules can be built as dynamic run:

./configure --help | grep -F =dynamic

Configurer, compiler et installer Nginx.

./configure --prefix=/etc/nginx \

            --sbin-path=/usr/sbin/nginx \

            --modules-path=/usr/lib/nginx/modules \

            --conf-path=/etc/nginx/nginx.conf \

            --error-log-path=/var/log/nginx/error.log \

            --pid-path=/var/run/nginx.pid \

            --lock-path=/var/run/nginx.lock \

            --user=nginx \

            --group=nginx \

            --build=Debian \

            --builddir=nginx-1.17.2 \

            --with-select_module \

            --with-poll_module \

            --with-threads \

            --with-file-aio \

            --with-http_ssl_module \

            --with-http_v2_module \

            --with-http_realip_module \

            --with-http_addition_module \

            --with-http_xslt_module=dynamic \

            --with-http_image_filter_module=dynamic \

            --with-http_geoip_module=dynamic \

            --with-http_sub_module \

            --with-http_dav_module \

            --with-http_flv_module \

            --with-http_mp4_module \

            --with-http_gunzip_module \

            --with-http_gzip_static_module \

            --with-http_auth_request_module \

            --with-http_random_index_module \

            --with-http_secure_link_module \

            --with-http_degradation_module \

            --with-http_slice_module \

            --with-http_stub_status_module \

            --with-http_perl_module=dynamic \

            --with-perl_modules_path=/usr/share/perl/5.26.1 \

            --with-perl=/usr/bin/perl \

            --http-log-path=/var/log/nginx/access.log \

            --http-client-body-temp-path=/var/cache/nginx/client_temp \

            --http-proxy-temp-path=/var/cache/nginx/proxy_temp \

            --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \

            --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \

            --http-scgi-temp-path=/var/cache/nginx/scgi_temp \

            --with-mail=dynamic \

            --with-mail_ssl_module \

            --with-stream=dynamic \

            --with-stream_ssl_module \

            --with-stream_realip_module \

            --with-stream_geoip_module=dynamic \

            --with-stream_ssl_preread_module \

            --with-compat \

            --with-pcre=../pcre-8.43 \

            --with-pcre-jit \

            --with-zlib=../zlib-1.2.11 \

            --with-openssl=../openssl-1.1.1c \

            --with-openssl-opt=no-nextprotoneg \

            --with-debug

 

make

sudo make install

Après la compilation, naviguez dans votre répertoire personnel (~).

cd ~

Faites un lien symbolique entre /usr/lib/nginx/modules et /etc/nginx/modules. Il s'agit d'un emplacement standard pour les modules Nginx.

sudo ln -s /usr/lib/nginx/modules /etc/nginx/modules

Affiche la version de Nginx, la version du compilateur et les paramètres du script de configuration.

sudo nginx -V

 

# nginx version: nginx/1.17.2 (Debian)

# built by gcc 8.3.0 (Debian 8.3.0-6)

# built with OpenSSL 1.1.1c  28 May 2019

# TLS SNI support enabled

# configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules . . .

# . . .

# . . .

Créez un groupe et un utilisateur système Nginx.

sudo adduser --system --home /nonexistent --shell /bin/false --no-create-home --disabled-login --disabled-password --gecos "nginx user" --group nginx

# Check that user and group are created

sudo tail -n 1 /etc/passwd /etc/group /etc/shadow

Vérifiez la syntaxe de Nginx et les erreurs éventuelles.

sudo nginx -t

# Will throw this error -> nginx: [emerg] mkdir() "/var/cache/nginx/client_temp" failed (2: No such file or directory)

 

# Create NGINX cache directories and set proper permissions

sudo mkdir -p /var/cache/nginx/client_temp /var/cache/nginx/fastcgi_temp /var/cache/nginx/proxy_temp /var/cache/nginx/scgi_temp /var/cache/nginx/uwsgi_temp

sudo chmod 700 /var/cache/nginx/*

sudo chown nginx:root /var/cache/nginx/*

 

# Re-check syntax and potential errors.

sudo nginx -t

Créer un fichier d'unité Nginx systemd.

sudo vim /etc/systemd/system/nginx.service

Remplissez le fichier /etc/systemd/system/nginx.service avec le contenu suivant.

[Unit]

Description=nginx - high performance web server

Documentation=https://nginx.org/en/docs/

After=network-online.target remote-fs.target nss-lookup.target

Wants=network-online.target

 

[Service]

Type=forking

PIDFile=/var/run/nginx.pid

ExecStartPre=/usr/sbin/nginx -t -c /etc/nginx/nginx.conf

ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf

ExecReload=/bin/kill -s HUP $MAINPID

ExecStop=/bin/kill -s TERM $MAINPID

 

[Install]

WantedBy=multi-user.target

Activez le démarrage de Nginx au démarrage et démarrez Nginx immédiatement.

sudo systemctl enable nginx.service

sudo systemctl start nginx.service

Vérifiez si Nginx s'initie automatiquement après un redémarrage.

sudo systemctl is-enabled nginx.service

# enabled

Vérifier le statut.

sudo systemctl status nginx.service

REMARQUE : vous pouvez vérifier que Nginx fonctionne en allant sur le domaine ou l'adresse IP de votre site dans un navigateur Web. Vous verrez la page de bienvenue de Nginx. C'est un indicateur que Nginx est en place et fonctionne sur votre VPS.

Créez un profil d'application UFW Nginx.

sudo vim /etc/ufw/applications.d/nginx

Copiez/collez le contenu suivant dans le fichier /etc/ufw/applications.d/nginx.

[Nginx HTTP]

title=Web Server (Nginx, HTTP)

description=Small, but very powerful and efficient web server

ports=80/tcp

 

[Nginx HTTPS]

title=Web Server (Nginx, HTTPS)

description=Small, but very powerful and efficient web server

ports=443/tcp

 

[Nginx Full]

title=Web Server (Nginx, HTTP + HTTPS)

description=Small, but very powerful and efficient web server

ports=80,443/tcp

Valider que les profils d'application UFW sont créés et reconnus.

sudo ufw app list

 

# Available applications:

  # Nginx Full

  # Nginx HTTP

  # Nginx HTTPS

  # OpenSSH

Nginx, par défaut, génère des fichiers de sauvegarde .default dans /etc/nginx. Supprimez les fichiers .default du répertoire /etc/nginx.

sudo rm /etc/nginx/*.default

Placez la coloration syntaxique de la configuration de Nginx pour l'éditeur Vim en ~/.vim.

# For regular non-root user

mkdir ~/.vim/

cp -r ~/nginx-1.17.2/contrib/vim/* ~/.vim/

# For root user

sudo mkdir /root/.vim/

sudo cp -r ~/nginx-1.17.2/contrib/vim/* /root/.vim/

NOTE : En effectuant l'étape ci-dessus, vous obtiendrez une belle coloration syntaxique lors de l'édition des fichiers de configuration Nginx dans l'éditeur Vim.

Créer les répertoires conf.d, snippets, sites-available et sites-enabled dans /etc/nginx.

sudo mkdir /etc/nginx/{conf.d,snippets,sites-available,sites-enabled}

Modifier les permissions et la propriété du groupe des fichiers journaux de Nginx.

sudo chmod 640 /var/log/nginx/*

sudo chown nginx:adm /var/log/nginx/access.log /var/log/nginx/error.log

Créez une configuration de rotation des journaux pour Nginx.

sudo vim /etc/logrotate.d/nginx

Remplissez le fichier avec le texte suivant, puis enregistrez et quittez.

/var/log/nginx/*.log {

    daily

    missingok

    rotate 52

    compress

    delaycompress

    notifempty

    create 640 nginx adm

    sharedscripts

    postrotate

            if [ -f /var/run/nginx.pid ]; then

                    kill -USR1 `cat /var/run/nginx.pid`

            fi

    endscript

}

Supprimez tous les fichiers téléchargés du répertoire personnel.

cd ~

rm -rf nginx-1.17.2/ openssl-1.1.1c/ pcre-8.43/ zlib-1.2.11/

Résumé

Maintenant, vous avez la dernière version de Nginx installée. Elle est compilée de manière statique avec certaines bibliothèques importantes comme OpenSSL. Souvent, la version d'OpenSSL fournie par le système est obsolète. En utilisant cette méthode d'installation avec une version plus récente d'OpenSSL, vous pouvez profiter des chiffrements modernes comme CHACHA20_POLY1305 et des protocoles comme TLS 1.3 qui sont disponibles dans OpenSSL 1.1.1. De plus, en compilant votre propre binaire, vous êtes en mesure de personnaliser les fonctionnalités de votre Nginx, ce qui est beaucoup plus flexible que d'installer un binaire pré-construit.